package sqlconn

/**
* @program: fileshare
*
* @description:
*
* @author: Koco.Allien
*
* @create: 2020-04-05 16:10
**/

import (
	"fileshare/conf"
	models "fileshare/controller/modles"
	"fileshare/utils"
	"os"
	"time"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	_ "github.com/jinzhu/gorm/dialects/sqlite"
)

var (
	MyDB *gorm.DB
)

//sqlite数据库的操作
func Run() {
	utils.MsgToLog("建立数据库连接")
	//连接数据库
	var err error
	sqltype := conf.Cfg.Key("sqlname").String()
	dbvalue := conf.Cfg.Key("dbvalue").String()
	utils.MsgToLog("数据库链接信息", sqltype, dbvalue)
	switch sqltype {
	case "mysql":
		MyDB, err = gorm.Open("mysql", dbvalue)
	case "sqlite":
		err := os.Chmod(dbvalue, os.ModePerm)
		if err != nil {
			utils.MsgToLog("mod文件出错", err)
			os.Exit(1)
		}
		MyDB, err = gorm.Open("sqlite3", dbvalue)
	default:
		utils.MsgToLog("获取数据库连接错误")
	}

	if err != nil {
		utils.MsgToLog("获取数据库连接错误")
		panic(err)
	}

	//配置数据库链接信息
	MyDB.SetLogger(utils.MyLog)
	MyDB.SingularTable(true)
	MyDB.LogMode(true)
	MyDB.DB().SetMaxIdleConns(10)
	MyDB.DB().SetMaxOpenConns(100)

	//自动建表，自动迁移
	myuser := &models.UserInfo{}
	myfile := &models.BelongInfo{}
	utils.MsgToLog("自动建表")
	//MyDB.CreateTable(myuser, myfile)
	MyDB.AutoMigrate(myuser, myfile)
	utils.MsgToLog("初始化完成...")

	//插入管理员
	InsertTest()
}

//关闭数据库链接
func CloseDB() {
	utils.MsgToLog("要关闭数据库")
	defer func() {
		if err := MyDB.Close(); err != nil {
			utils.MsgToLog("数据库关闭失败" + err.Error())
		}
	}()
}

//测试插入信息代码
func InsertTest() {
	utils.MsgToLog("插入配置信息到数据库")

	MyDB.Model(&models.UserInfo{}).FirstOrCreate(&models.UserInfo{
		ID:       1,
		CreateAt: time.Now().Local(),
		UpdateAt: time.Now().Local(),
		Name:     "public",
		Account:  "",
		Password: "",
		Role:     0})

	MyDB.Model(&models.UserInfo{}).FirstOrCreate(&models.UserInfo{
		ID:       2,
		CreateAt: time.Now().Local(),
		UpdateAt: time.Now().Local(),
		Name:     "admin",
		Account:  conf.Cfg.Key("account").MustString("koco"),
		Password: conf.Cfg.Key("password").MustString("koco"),
		Role:     5})
	//
	MyDB.Model(&models.BelongInfo{}).FirstOrCreate(&models.BelongInfo{
		ID:       1,
		UID:      1,
		CreateAt: time.Now().Local(),
		UpdateAt: time.Now().Local(),
		UName:    "root",
		FFname:   "/",
		FPath:    "/",
		Isfolder: true,
		ToUserid: 1,
		ShareUrl: "",
		Code:     "",
		Root:     0,
	})
	utils.LOGToLog("测试插入代码完成")

}

//查询的测试代码
func SelectTest() {
	utils.MsgToLog("运行测试插入信息代码...")
	u := models.UserInfo{}
	MyDB.Find(&u)
	utils.MsgToLog("运行测试插入信息代码结果:" + u.Name)
	MyDB.Delete(&u)
}
